package ahp.client;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class AHP {

	public ArrayList<Kategoria> kategorie;
	public double[][] macierzPorownan;
	public ArrayList<String> kandydatki;
	public ArrayList<String> nazwyKategorii;
	public Kategoria preferencje;
	public TreeMap<String, Double> wynikAHP;

	public AHP() {
		kandydatki = new ArrayList<String>();
		nazwyKategorii = new ArrayList<String>();
		kategorie = new ArrayList<Kategoria>();
		init();
		macierzPorownan = new double[nazwyKategorii.size()][nazwyKategorii
				.size()];
		for (int i = 0; i < nazwyKategorii.size(); i++) {
			kategorie.add(new Kategoria(nazwyKategorii.get(i),
					new double[kandydatki.size()][kandydatki.size()]));
		}
	}

	private void czytajPlik() {
		try {
			String line = "";
			String[] splitted;
			int kategoria, i, j;
			double wartosc;

			BufferedReader br = new BufferedReader(new InputStreamReader(
					new DataInputStream(new FileInputStream("dane.txt"))));

			if (br.readLine().equals("=kat=")) {
				while ((line = br.readLine()) != null && !line.equals("")) {
					splitted = line.split(" ");
					i = Integer.parseInt(splitted[0]);
					j = Integer.parseInt(splitted[1]);
					wartosc = Double.parseDouble(splitted[2]);
					macierzPorownan[i][j] = wartosc;
					macierzPorownan[j][i] = 1 / wartosc;
				}
			}
			preferencje = new Kategoria("preferencje", macierzPorownan);
			if (br.readLine().equals("=por=")) {
				while ((line = br.readLine()) != null && !line.equals("")) {
					splitted = line.split(" ");
					kategoria = Integer.parseInt(splitted[0]);
					i = Integer.parseInt(splitted[1]);
					j = Integer.parseInt(splitted[2]);
					wartosc = Double.parseDouble(splitted[3]);
					kategorie.get(kategoria).macierz[i][j] = wartosc;
					kategorie.get(kategoria).macierz[j][i] = 1 / wartosc;
				}
			}
			br.close();

		} catch (Exception e) {
			System.err.println("Error: " + e.getMessage());
		}
	}

	private void init() {
		try {
			String line = "";

			BufferedReader br = new BufferedReader(new InputStreamReader(
					new DataInputStream(new FileInputStream("config.txt"))));

			if (br.readLine().equals("=kandydatki="))
				while ((line = br.readLine()) != null && !line.equals("")) {
					kandydatki.add(line);
				}
			if (br.readLine().equals("=kategorie=")) {
				while ((line = br.readLine()) != null && !line.equals("")) {
					nazwyKategorii.add(line);
				}
			}
			br.close();
		} catch (Exception e) {
			System.err.println("Error: " + e.getMessage());
		}
	}

	private void start() {
		czytajPlik();
		System.out.println("Ranking kategorii: ");
		preferencje.licz_spojnosc();
		for (int i = 0; i < kategorie.size(); i++) {
			System.out.println("\n***************************************\n");
			System.out.println("Kategoria: " + kategorie.get(i).nazwa);
			kategorie.get(i).licz_spojnosc();
		}
		obliczWektor();

		System.out.println("\n============== Ranking kandydatek: ==============\n" + wynikAHP.toString());

		// wy�wietlenie macierzy wczytanej z pliku
		// System.out.println( kategorie.get(0).nazwa);
		// for (int i = 0; i < kategorie.get(0).macierz.length; i++) {
		// for (int j = 0; j < kategorie.get(0).macierz.length; j++) {
		// System.out.print( kategorie.get(0).macierz[i][j] + " ");
		// }
		// System.out.println();
		// }

	}

	//zwraca ranking kandydatek
	private void obliczWektor() {
		double factor;
		HashMap<String, Double> mapa = new HashMap<String, Double>();
		for (int i = 0; i < kandydatki.size(); i++) {
			factor = 0;
			for (int j = 0; j < nazwyKategorii.size(); j++) {
				factor += preferencje.wektor_preferencji[j]
						* kategorie.get(j).wektor_preferencji[i];
			}
			mapa.put(kandydatki.get(i), factor);
		}
		wynikAHP = new TreeMap<String, Double>(new MapComparator(mapa));
		wynikAHP.putAll(mapa);
		

	}

	public static void main(String[] args) {
		AHP main = new AHP();
		main.start();
	}

	private class MapComparator implements Comparator<String> {

		Map<String, Double> baza;

		public MapComparator(Map<String, Double> base) {
			this.baza = base;
		}

		public int compare(String a, String b) {
			if (baza.get(a) >= baza.get(b)) {
				return -1;
			} else {
				return 1;
			}
		}
	}
}